home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / guis für programme / devicelock / txt / dlprefs.mod < prev    next >
Text File  |  1996-04-07  |  13KB  |  404 lines

  1. MODULE DLprefs; 
  2.  
  3. IMPORT c  := Conversions,
  4.        d  := Dos,
  5.        DLs:= DLstrings,
  6.        DLr:= DLrequester,
  7.        e  := Exec,
  8.        fs := FileSystem,
  9.        hot:= HotKey,
  10.        I  := Intuition,
  11.        ol := OberonLib,
  12.        s  := Strings,
  13.        sys:= SYSTEM,
  14.        u  := Utility,
  15.        WB := WBReadArgs,
  16.        w  := Workbench;
  17.  
  18.  
  19. (*-------------------------------------------------------------------------*)
  20.  
  21. CONST
  22.   identLength     = 20;  (*  * drivenum * 2 *)
  23.   passkeyLength   = 30;  (*  * drivenum    *)
  24.   pubLength       = 60;  (*  * 1  *)
  25.   lockLength      = 30;  (*  * 2  *)
  26.  
  27.   lckallHot    -= -1;
  28.   opencloseHot -= -2;
  29.   gotofrontHot -= -3;
  30.   normallHot   -= -4;
  31.  
  32.   template = "SETTINGS/K,PS=PUBSCREEN/K,NOWARNINGS/S,TOOLPRI/N/K,"
  33.              "CX_PRIORITY/N/K,CX_POPUP/K,CX_POPKEY/K";
  34.  
  35.   LPkeep   -= 0;
  36.   LPlock   -= 1;
  37.   LPunlock -= -1;
  38.  
  39.  
  40. (*-------------------------------------------------------------------------*)
  41.  
  42. TYPE
  43.   LPOINTER = UNTRACED POINTER TO LONGINT;
  44.  
  45.   ARGV = STRUCT
  46.            settings  : e.LSTRPTR;
  47.            pubscr    : e.LSTRPTR;
  48.            noWarnings: LONGINT;
  49.            toolpri   : LPOINTER;
  50.            pri      -: LPOINTER;
  51.            popup     : e.LSTRPTR;
  52.            popkey    : e.LSTRPTR;
  53.          END;  
  54.  
  55.   driveT * = RECORD
  56.              GadPtr         *: I.GadgetPtr;
  57.              PrintName      *: ARRAY identLength OF CHAR;
  58.              DeviceName     *: ARRAY identLength OF CHAR;          
  59.              PassKey        *: ARRAY passkeyLength OF CHAR;
  60.              disabled       *: BOOLEAN;
  61.              locked         *: BOOLEAN;
  62.              lockprefs      -: SHORTINT; 
  63.              disabledchanged*: BOOLEAN;
  64.            END;
  65.   driveP * = POINTER TO ARRAY OF driveT;
  66.  
  67.   PrefsT = RECORD
  68.              LeftEdge       -: INTEGER;
  69.              TopEdge        -: INTEGER;
  70.              SizeOnlyZoom   -: BOOLEAN;
  71.              LeftEdgeZoomed -: INTEGER;
  72.              TopEdgeZoomed  -: INTEGER;
  73.              OpenWindow     -: BOOLEAN;
  74.              OpenZoomed     -: BOOLEAN;
  75.              CheckTime      -: INTEGER;
  76.  
  77.   (* do not store HotKeyDescriptions, only add them and then forget them
  78.      (for now!)
  79.              KeyLock        -: ARRAY OF CHAR;
  80.              KeyWindow      -: ARRAY OF CHAR;
  81.              KeyFront       -: ARRAY OF CHAR; *)
  82.  
  83.              PubScreen      -: ARRAY pubLength  OF CHAR;
  84.              LockString     -: ARRAY lockLength OF CHAR;
  85.              UnlockString   -: ARRAY lockLength OF CHAR;
  86.              NotifyDL       -: BOOLEAN;   (* not implemented *)
  87.              UnlockBeep     -: BOOLEAN;
  88.              LockAllBeep    -: BOOLEAN;
  89.              NormAllBeep    -: BOOLEAN;
  90.              RemPosition    -: BOOLEAN;   (* not implemented *)
  91.              DriveNum       -: INTEGER;
  92.            END;
  93.  
  94.  
  95. (*-------------------------------------------------------------------------*)
  96.  
  97. VAR
  98.   OSrelease3     -: BOOLEAN;
  99.  
  100.  
  101.   Buffer1      *: ARRAY 256 OF CHAR;
  102.   Buffer2       : ARRAY 256 OF CHAR;
  103.  
  104.   drive        *: driveP;
  105.   Prefs        *: PrefsT;
  106.  
  107.   Argv         -: ARGV;
  108.   Arguments     : d.RDArgsPtr;
  109.   wbargs        : WB.Arguments;
  110.   wbm           : w.WBStartupPtr;
  111.  
  112. (*-------------------------------------------------------------------------*)
  113.  
  114. CONST
  115.   PrefsConst = PrefsT(0,0,FALSE,-10,-10,TRUE,FALSE,5,"",
  116.                       "lock %s on %s","lock %s off %s",FALSE,TRUE,FALSE,FALSE,FALSE,0);
  117.   prgName  = "DeviceLock";
  118.  
  119.  
  120.  
  121. (*------ Read Prefs in DeviceLock.prefs from "", ENV: or PROGDIR: --------*)
  122.  
  123. PROCEDURE ReadPrefs*();
  124. VAR
  125.     wrongCV : BOOLEAN;
  126.     conf    : fs.File;
  127.     opwin   : BOOLEAN;
  128.     length  : INTEGER;
  129.  
  130.   (*---- Tries to Open settings and checks Version and returns TRUE
  131.          if there is a valid settings file                            -----*)
  132.  
  133.   PROCEDURE SearchPrefs(path: ARRAY OF CHAR):BOOLEAN;  (* $CopyArrays- *)
  134.   BEGIN
  135.     COPY(path,Buffer2);
  136.     IF ~ (fs.Open(conf,Buffer2,FALSE) AND fs.ReadString(conf,Buffer1)) THEN RETURN(FALSE) END;
  137.     s.Cut(Buffer1,s.Occurs(Buffer1,"VER")+5,16,Buffer2);
  138.     IF u.Strnicmp("DeviceLock.Prefs",Buffer2,17)#0 THEN
  139.       wrongCV := TRUE;
  140.       IF conf.handle # NIL THEN IF fs.Close(conf) THEN END END;
  141.       RETURN(FALSE);
  142.     ELSE
  143.       RETURN(TRUE)
  144.     END;
  145.   END SearchPrefs;
  146.  
  147.   (*---- Read Line from input, skipping lines beginning with ; ------------*)
  148.  
  149.   PROCEDURE GetNewLine():BOOLEAN;
  150.   VAR i     : INTEGER;
  151.       ret   : BOOLEAN;
  152.       equpos: INTEGER;
  153.   BEGIN
  154.     REPEAT
  155.       ret := fs.ReadString(conf,Buffer1);
  156.     UNTIL ((Buffer1[0]#";") & (Buffer1[0]#" ") & (Buffer1[0]#0X)) OR (ret=FALSE);
  157.     IF ret THEN
  158.        length := SHORT(s.Length(Buffer1));
  159.        i := 0;
  160.        WHILE ((i < length) & (Buffer1[i]#";")) DO
  161.          INC(i);
  162.        END; (* WHILE *)
  163.        IF Buffer1[i]=";" THEN Buffer1[i] := 0X END;
  164.        i := SHORT(s.Length(Buffer1))-1;
  165.        WHILE (i > 0) & ((Buffer1[i]=" ") OR (Buffer1[i]=09X)) DO
  166.          DEC(i);
  167.        END;
  168.        Buffer1[i+1]:=0X;
  169.        length := SHORT(s.Length(Buffer1));
  170.        i := 0;
  171.        WHILE ((i < length) & (Buffer1[i]#"=")) DO
  172.          INC(i);
  173.        END; (* WHILE *)
  174.        IF Buffer1[i]="=" THEN equpos := i ELSE equpos := -1 END;
  175.        IF (equpos = -1) OR (equpos+1 = length) THEN
  176.          Buffer2 := "INVALID";
  177.        ELSE
  178.          s.Cut(Buffer1,equpos+1,length-equpos-1,Buffer2);
  179.          Buffer1[equpos]:="\o";
  180.          length := SHORT(s.Length(Buffer2));
  181.        END;
  182.     END;
  183.     RETURN ret;
  184.   END GetNewLine;
  185.  
  186.   (*---- Convert Number, complain if not possible -------------------------*)
  187.  
  188.   PROCEDURE ConvNumber():INTEGER;
  189.   VAR number  : LONGINT;
  190.   BEGIN
  191.     IF c.StringToInt(Buffer2,number) & (number <= MAX(INTEGER)) THEN
  192.       RETURN(SHORT(number))
  193.     ELSE
  194.       DLr.RequestWarning(DLs.GetString(DLs.WarnCorruptNumber),sys.ADR(Buffer2));
  195.       RETURN (0);
  196.     END;
  197.   END ConvNumber;
  198.  
  199.   (*---- Convert Boolean, complain if not possible ------------------------*)
  200.  
  201.   PROCEDURE ConvBool():BOOLEAN;
  202.   BEGIN
  203.     IF CAP(Buffer2[0]) = "N" THEN RETURN FALSE
  204.     ELSIF CAP(Buffer2[0]) = "Y" THEN RETURN TRUE
  205.     ELSE
  206.       DLr.RequestWarning(DLs.GetString(DLs.WarnCorruptBoolean),sys.ADR(Buffer2));
  207.       RETURN(FALSE);
  208.     END;
  209.   END ConvBool;
  210.  
  211.   (*---- Copy String and check if orginal length --------------------------*)
  212.  
  213.   PROCEDURE CopyTo(VAR str: ARRAY OF CHAR);
  214.   BEGIN
  215.     COPY(Buffer2,str);
  216.     str[LEN(str)-1] := "\o"; (* Our strings end with \o ! *)
  217.     IF (s.Length(str) # s.Length(Buffer2)) THEN
  218.       DLr.RequestWarning(DLs.GetString(DLs.WarnStringTooLong),sys.ADR(str));
  219.     END;
  220.   END CopyTo;
  221.  
  222.   (*---- Tries to add Hotkey and warns on failure -------------------------*)
  223.   PROCEDURE AddKey (ID: INTEGER);
  224.   BEGIN
  225.     IF ~hot.AddKey (Buffer2,ID) THEN
  226.       IF hot.badDescription IN hot.ErrorSet THEN
  227.          DLr.RequestWarning(DLs.GetString(DLs.WarnNotValidKeyCode),sys.ADR(Buffer2));
  228.       ELSE
  229.        DLr.RequestWarning(DLs.GetString(DLs.WarnCannotAddKeyCode),sys.ADR(Buffer2));
  230.       END;
  231.     END;
  232.   END AddKey;
  233.  
  234.   (*---- Tries to determine number of drives ------------------------------*)
  235.   PROCEDURE GetNumberOfDrives():INTEGER;
  236.   VAR num: INTEGER;
  237.       ret: BOOLEAN;
  238.   BEGIN
  239.     num := 0;
  240.     REPEAT
  241.       ret := fs.ReadString(conf,Buffer1);
  242.       IF ret & (Buffer1[0]#";") & (Buffer1[0]#" ") & (Buffer1[0]#0X) THEN
  243.         IF u.Strnicmp("DeviceName=",Buffer1,11)=0 THEN INC(num) END;
  244.       END;
  245.     UNTIL ret=FALSE;
  246.     IF fs.Move(conf,0) THEN END;
  247.     RETURN(num);
  248.   END GetNumberOfDrives;
  249.  
  250.  
  251. BEGIN
  252. wrongCV := FALSE;
  253. opwin := FALSE;
  254. IF Argv.settings # NIL THEN
  255.   IF ~ SearchPrefs(Argv.settings^) THEN
  256.     IF wrongCV THEN
  257.       DLr.BailOut(DLs.GetString(DLs.ErrGivenSettingsNotValid)^);
  258.     ELSE
  259.       DLr.BailOut(DLs.GetString(DLs.ErrCantOpenOrReadGivenSettings)^);
  260.     END;
  261.   END;
  262. ELSE
  263.   IF ~ SearchPrefs("DeviceLock.Prefs") THEN
  264.     IF ~ SearchPrefs("ENV:DeviceLock.Prefs") THEN
  265.       IF ~ SearchPrefs("PROGDIR:DeviceLock.Prefs") THEN
  266.         IF wrongCV THEN
  267.           DLr.BailOut(DLs.GetString(DLs.ErrWrongPrefs)^);
  268.         ELSE
  269.           DLr.BailOut(DLs.GetString(DLs.ErrCantFindAnyPrefs)^);
  270.         END;
  271.       END;
  272.     END;
  273.   END;
  274. END;
  275.  
  276. Prefs.DriveNum := GetNumberOfDrives();
  277. IF Prefs.DriveNum >= MAX(INTEGER) THEN Prefs.DriveNum := MAX(INTEGER)-1 END;
  278. IF Prefs.DriveNum = 0 THEN DLr.BailOut(DLs.GetString(DLs.ErrZeroDrives)^) END;
  279. NEW(drive,Prefs.DriveNum);
  280.  
  281. Prefs.DriveNum := -1;
  282. WHILE GetNewLine() DO
  283.   IF    u.Stricmp(Buffer2,"INVALID")       = 0 THEN 
  284.     DLr.RequestWarning(DLs.GetString(DLs.WarnCommentIsNoComment),sys.ADR(Buffer1));
  285.   ELSIF u.Stricmp(Buffer1,"LeftEdge")      = 0 THEN Prefs.LeftEdge       := ConvNumber()
  286.   ELSIF u.Stricmp(Buffer1,"TopEdge")       = 0 THEN Prefs.TopEdge        := ConvNumber()
  287.   ELSIF u.Stricmp(Buffer1,"LeftEdgeZoomed")= 0 THEN Prefs.LeftEdgeZoomed := ConvNumber()
  288.   ELSIF u.Stricmp(Buffer1,"TopEdgeZoomed") = 0 THEN Prefs.TopEdgeZoomed  := ConvNumber()
  289.   ELSIF u.Stricmp(Buffer1,"CheckTime")     = 0 THEN Prefs.CheckTime      := ConvNumber()
  290.   ELSIF u.Stricmp(Buffer1,"OpenWindow")    = 0 THEN Prefs.OpenWindow     := ConvBool()
  291.   ELSIF u.Stricmp(Buffer1,"OpenZoomed")    = 0 THEN Prefs.OpenZoomed     := ConvBool()
  292.   ELSIF u.Stricmp(Buffer1,"SizeOnlyZoom")  = 0 THEN Prefs.SizeOnlyZoom   := ConvBool()
  293.   ELSIF u.Stricmp(Buffer1,"UnlockBeep")    = 0 THEN Prefs.UnlockBeep     := ConvBool()
  294.   ELSIF u.Stricmp(Buffer1,"LockAllBeep")   = 0 THEN Prefs.LockAllBeep    := ConvBool()
  295.   ELSIF u.Stricmp(Buffer1,"NormAllBeep")   = 0 THEN Prefs.NormAllBeep    := ConvBool()
  296.   ELSIF u.Stricmp(Buffer1,"RemPosition")   = 0 THEN Prefs.RemPosition    := ConvBool()
  297.   ELSIF u.Stricmp(Buffer1,"NotifyDL")      = 0 THEN Prefs.NotifyDL       := ConvBool()
  298.   ELSIF u.Stricmp(Buffer1,"KeyLock")       = 0 THEN AddKey(lckallHot)
  299.   ELSIF u.Stricmp(Buffer1,"KeyNorm")       = 0 THEN AddKey(normallHot)
  300.   ELSIF u.Stricmp(Buffer1,"KeyWindow")     = 0 THEN
  301.     IF Argv.popkey # NIL THEN COPY(Argv.popkey^,Buffer2) END;
  302.     AddKey(opencloseHot);
  303.   ELSIF u.Stricmp(Buffer1,"KeyFront")      = 0 THEN AddKey(gotofrontHot)
  304.   ELSIF u.Stricmp(Buffer1,"PubScreen")     = 0 THEN CopyTo(Prefs.PubScreen)
  305.   ELSIF u.Stricmp(Buffer1,"LockString")    = 0 THEN CopyTo(Prefs.LockString)
  306.   ELSIF u.Stricmp(Buffer1,"UnlockString")  = 0 THEN CopyTo(Prefs.UnlockString)
  307.   ELSIF u.Stricmp(Buffer1,"DeviceName")    = 0 THEN
  308.     INC(Prefs.DriveNum);
  309.     CopyTo(drive[Prefs.DriveNum].DeviceName);
  310.     COPY(drive[Prefs.DriveNum].DeviceName, drive[Prefs.DriveNum].PrintName);
  311.     drive[Prefs.DriveNum].lockprefs := LPlock;
  312.   ELSIF u.Stricmp(Buffer1,"PrintName")     = 0 THEN
  313.     IF (Prefs.DriveNum >= 0) THEN CopyTo(drive[Prefs.DriveNum].PrintName) END
  314.   ELSIF u.Stricmp(Buffer1,"PassKey")       = 0 THEN
  315.     IF (Prefs.DriveNum >= 0) THEN CopyTo(drive[Prefs.DriveNum].PassKey) END
  316.   ELSIF u.Stricmp(Buffer1,"Lock")          = 0 THEN
  317.     IF (Prefs.DriveNum >= 0) THEN
  318.       IF Buffer2[0] = "*" THEN drive[Prefs.DriveNum].lockprefs := LPkeep
  319.       ELSIF Buffer2[0] = "-" THEN drive[Prefs.DriveNum].lockprefs := LPunlock
  320.       ELSIF Buffer2[0] = "+" THEN drive[Prefs.DriveNum].lockprefs := LPlock
  321.       ELSIF CAP(Buffer2[0]) = "N" THEN drive[Prefs.DriveNum].lockprefs := LPkeep
  322.       ELSIF CAP(Buffer2[0]) = "Y" THEN drive[Prefs.DriveNum].lockprefs := LPlock
  323.       ELSE
  324.         DLr.RequestWarning(DLs.GetString(DLs.WarnCorruptLockValue),sys.ADR(Buffer2));
  325.         drive[Prefs.DriveNum].lockprefs := LPlock;
  326.       END;
  327.     END;
  328.   ELSIF u.Stricmp(Buffer1,"HotKey")        = 0 THEN
  329.     IF (Prefs.DriveNum >= 0) THEN AddKey(Prefs.DriveNum+1) END
  330.   ELSE DLr.RequestWarning(DLs.GetString(DLs.WarnUnknownOption),sys.ADR(Buffer1)) 
  331.   END; (* IF *)
  332. END; (* WHILE *)
  333.  
  334. INC(Prefs.DriveNum);
  335. IF (Prefs.SizeOnlyZoom & OSrelease3) THEN
  336.   Prefs.LeftEdgeZoomed := -1;
  337.   Prefs.TopEdgeZoomed := -1;
  338. ELSE
  339.   IF (Prefs.LeftEdgeZoomed = -10) THEN Prefs.LeftEdgeZoomed := Prefs.LeftEdge END;
  340.   IF (Prefs.TopEdgeZoomed  = -10) THEN Prefs.TopEdgeZoomed  := Prefs.TopEdge END;
  341. END;
  342.  
  343. IF Argv.popup  # NIL THEN
  344.   COPY(Argv.popup^,Buffer2);
  345.   Prefs.OpenWindow := ConvBool();
  346. END; (* IF *)
  347. IF Argv.pubscr # NIL THEN
  348.   COPY(Argv.pubscr^,Buffer2);
  349.   CopyTo(Prefs.PubScreen);
  350. END; (* IF *)
  351.  
  352. IF conf.handle#NIL THEN IF fs.Close(conf) THEN END END;
  353.  
  354. END ReadPrefs;
  355.  
  356. (*------ Read CLI or Workbench arguments ---------------------------------*)
  357.  
  358. PROCEDURE ReadArgs*();
  359. BEGIN
  360.   NEW(Argv.pri); NEW(Argv.toolpri);
  361.   Argv.pri^ := 0; Argv.toolpri^ := 1;
  362.   
  363.   IF ol.wbStarted THEN
  364.     wbm := ol.wbenchMsg;
  365.     IF ~ WB.ReadArgs(wbm.argList[0],template,Argv,wbargs) THEN
  366.       DLr.BailOut(DLs.GetString(DLs.ErrWBReadArgs)^);
  367.     END;
  368.   ELSE
  369.   Arguments := d.OldReadArgs(template,Argv,NIL);
  370.   IF Arguments = NIL THEN
  371.     IF d.PrintFault(d.IoErr(),prgName) THEN END;
  372.     HALT(20);
  373.   END;
  374.   END;
  375.  
  376.   IF Argv.noWarnings = d.DOSTRUE THEN DLr.noWarnings := TRUE END;
  377.   sys.SETREG(0,e.SetTaskPri(DLr.NoDosRequester(),Argv.toolpri^));
  378. END ReadArgs;
  379.  
  380. (*------ Free CLI or Workbench arguments ---------------------------------*)
  381.  
  382. PROCEDURE FreeArgs*();
  383. BEGIN
  384.   (* Save to call with NIL ! *)
  385.   d.FreeArgs(Arguments); Arguments := NIL;
  386.   WB.FreeArgs(wbargs);
  387. END FreeArgs;
  388.  
  389. (***************************************************************************
  390.          M A I N
  391.  ***************************************************************************)
  392.  
  393. BEGIN
  394.   OSrelease3 := I.int.libNode.version > 38;
  395.   Prefs := PrefsConst;
  396.   IF OSrelease3 THEN Prefs.SizeOnlyZoom := TRUE END;
  397.  
  398. CLOSE
  399.     (* Save to call with NIL ! *)
  400.     d.FreeArgs(Arguments);
  401.     WB.FreeArgs(wbargs);
  402.  
  403. END DLprefs.
  404.